package com.bsoft.mob.deviceinfo;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Environment;
import android.support.v4.content.ContextCompat;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * Created by classichu on 2018/3/2.
 * <p>
 * 逻辑上的 Internal storage:
 * 1 总是可用的
 * 2 这里的文件默认只能被我们的app所访问。
 * 3 当用户卸载app的时候，系统会把internal内该app相关的文件都清除干净。
 * 4 Internal是我们在想确保不被用户与其他app所访问的最佳存储区域。
 * <p>
 * data 目录
 * <p>
 * 这下面的文件会在用户卸载我们的app时被系统删除
 * <p>
 * Android6.0+支持多用户 /data/user/0/<application package>
 */

public class LogicalInternalStorageTool {

    /**
     * /cache
     *
     * @return
     */
    @Deprecated //功能示例
    public static String getDownloadCacheDirectoryPath() {
        return Environment.getDownloadCacheDirectory().getAbsolutePath();
    }


    /**
     * /system
     */
    @Deprecated //功能示例
    public static String getRootDirectoryPath() {
        return Environment.getRootDirectory().getAbsolutePath();
    }


    /**
     * /data
     */
    @Deprecated //功能示例
    public static String getDataDirectoryPath() {
        return Environment.getDataDirectory().getAbsolutePath();
    }

    /**
     * app 的 internal 目录
     * <p>
     * /data/data/<application package>/files
     * <p>
     * miui等系统应用多开 时候
     * /data/user/0/<application package>/files
     * miui等系统应用多开 时候 小号
     * /data/user/999/<application package>/files
     *
     * @param context
     * @return
     */
    public static String getFilesDirPath(Context context) {
        return context.getFilesDir().getAbsolutePath();
    }

    /**
     * /data/data/<application package>/files/file1
     */
    @Deprecated //功能示例
    public static String getFileStreamPath(Context context) {
        return context.getFileStreamPath("file1").getAbsolutePath();
    }

    /**
     * 对于 Files 目录下的文件，通常不会通过 File 类的方式直接进行读写，而是利用一些封装过的类或函数进行操作
     * /data/data/<application package>/files/file2  的 FileInputStream
     */
    @Deprecated //功能示例
    public static FileInputStream openFileInput(Context context) {
        try {
            return context.openFileInput("file2");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 对于 Files 目录下的文件，通常不会通过 File 类的方式直接进行读写，而是利用一些封装过的类或函数进行操作
     * /data/data/<application package>/files/file2  的 FileOutputStream
     */
    @Deprecated //功能示例
    public static FileOutputStream openFileOutput(Context context) {
        try {
            return context.openFileOutput("file2", Context.MODE_PRIVATE);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 对于 Files 目录下的文件，通常不会通过 File 类的方式直接进行读写，而是利用一些封装过的类或函数进行操作
     * 删除
     */
    @Deprecated //功能示例
    public static boolean deleteFile(Context context) {
        return context.deleteFile("file2");
    }

    /**
     * 对于 Files 目录下的文件，通常不会通过 File 类的方式直接进行读写，而是利用一些封装过的类或函数进行操作
     * 查询
     */
    @Deprecated //功能示例
    public static String[] fileList(Context context) {
        return context.fileList();
    }

    /**
     * app 的 internal 缓存目录
     * <p>
     * /data/data/<application package>/cache
     * miui等系统应用多开 时候
     * /data/user/0/<application package>/cache
     * miui等系统应用多开 时候 小号
     * /data/user/999/<application package>/cache
     *
     * @param context
     * @return
     */
    public static String getCacheDirPath(Context context) {
        return context.getCacheDir().getAbsolutePath();
    }

    /**
     * 检索目录，如果没有，该方法会在 /data/data/application package>/ 目录下生成一个以 app_ 开头的文件夹
     * /data/data/<application package>/app_dir1
     *
     * @param context
     * @return
     */
    @Deprecated //功能示例
    public static String getDirPath(Context context) {
        return context.getDir("dir1", Context.MODE_PRIVATE).getAbsolutePath();
    }

    /**
     * /data/data/<application package>/shared_prefs/sp
     *
     * @param context
     * @return
     */
    @Deprecated //功能示例
    public static SharedPreferences getSharedPreferences(Context context) {
        return context.getSharedPreferences("sp", Context.MODE_PRIVATE);
    }

    @Deprecated //功能示例
    public static boolean deleteSharedPreferences(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return context.deleteSharedPreferences("sp");
        }
        return false;
    }

    /**
     * name 是 SQLiteDatabase.openOrCreateDatabase(String name ... 中的name
     *
     * @param context
     * @return
     */
    @Deprecated //功能示例
    public static String getDatabasePath(Context context) {
        return context.getDatabasePath("dbname.db").getAbsolutePath();
    }

    /**
     * /data/data/<application package>
     * @param context
     * @return
     */
    public static String getDataDir(Context context) {
        return ContextCompat.getDataDir(context).getAbsolutePath();
    }
    /**
     * /data/data/<application package>/no_backup
     * @param context
     * @return
     */
    @Deprecated //功能示例
    public static String getNoBackupFilesDirPath(Context context) {
        return ContextCompat.getNoBackupFilesDir(context).getAbsolutePath();
    }
    /**
     * /data/data/<application package>/code_cache
     * @param context
     * @return
     */
    @Deprecated //功能示例
    public static String getCodeCacheDirPath(Context context) {
        return ContextCompat.getCodeCacheDir(context).getAbsolutePath();
    }
}
